package com.example;

import org.junit.Test;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Arrays;

/**
 * File类
 */
public class FileTest {

    @Test
    public void test01() {
        /**
         * File类对象表示的文件/文件夹是可以不存在的
         */
        File file1 = new
                File("F:\\课堂\\Java面向对象编程基础\\data\\a.txt");
        File file2 = new File("F:\\课堂\\Java面向对象编程基础\\data\\f.txt");
        // 判断file对象表示的文件/文件夹是否存在
        System.out.println(file1.exists()); // true
        System.out.println(file2.exists()); // false
        File file3 = new File("F:\\课堂\\Java面向对象编程基础\\data");
        System.out.println(file1.isFile()); // true
        System.out.println(file3.isFile()); // false
        File file4 = new
                File("F:\\课堂\\Java面向对象编程基础\\data", "a.txt");
        File file5 = new File(file3, "a.txt");
        System.out.println(file4.exists()); // true
        System.out.println(file5.exists()); // true
        File file = new File("src/com/example/index.html");
        System.out.println(file.exists()); // true
    }

    @Test
    public void test02() {
        File file = new
                File("F:\\课堂\\Java面向对象编程基础\\data\\a.txt");
        System.out.println(file.getName()); // a.txt
        System.out.println(file.getAbsolutePath()); // 全路径文件名
        System.out.println(file.getPath()); // 构造方法中的路径（可能是相对路径）
        File dir = file.getParentFile(); // 父文件夹
        // 获取子文件夹/子文件，仅直接子元素
        File[] files = dir.listFiles();
        System.out.println(Arrays.toString(files));
    }

    /**
     * 创建文件
     * 删除文件
     */
    @Test
    public void test03() throws IOException {
        File file = new
                File("F:\\课堂\\Java面向对象编程基础\\data",
                "e.txt");
        /*
            创建文件不成功的情况：
            1.父文件夹不存在，抛异常
            2.父文件夹不具有创建文件的权限
        */
        if (!file.exists()) {
            boolean flag = file.createNewFile();
            System.out.println(flag);
        } else {
            System.out.println("已存在");
        }
        file.delete();
        // file.deleteOnExit(); // 虚拟机停止的时候删除
    }

    /**
     * 在指定目录创建临时文件
     */
    @Test
    public void test04() throws IOException {
        File dir = new
                File("F:\\课堂\\Java面向对象编程基础\\data");
        File temp = File.createTempFile("temp", ".txt", dir);
        temp.delete();
    }

    /**
     * 重命名
     */
    @Test
    public void test05() {
        File file = new
                File("F:\\课堂\\Java面向对象编程基础\\data\\c.txt");
        File newFile = new
                File("F:\\课堂\\Java面向对象编程基础\\data\\d.txt");
        /* 原始文件名被修改 */
        file.renameTo(newFile);
    }

    /**
     * 创建文件夹
     */
    @Test
    public void test06() {
        /* 递归创建 */
        File dir = new File("F:/a/b/c/d");
        if (!dir.exists()) {
            // dir.mkdir(); // 创建单层目录
            boolean flag = dir.mkdirs(); // 创建多层目录
            System.out.println(flag);
        }
    }

    /**
     * 递归删除，把目标文件以及内部的所有东西删除
     * 慎用
     */
    @Test
    public void test07() {
        File file = new
                File("F:\\课堂\\Java面向对象编程基础\\data - 副本");
        deleteFile(file);
    }

    /**
     * 通用删除方法
     * @param file
     */
    private static void deleteFile(File file) {
        if (file == null || !file.exists()) {
            return;
        }
        // 区分文件夹和文件
        if (file.isDirectory()) {
            // 获取子元素，子元素可能没有
            File[] files = file.listFiles(); // 可能为null
            if (files != null) {
                // f子元素可能是文件/文件夹
                for (File f : files) {
                    deleteFile(f);
                }
            }
        }
        file.delete(); // 删除本身，可能是文件/空文件夹
    }

    /**
     * 文件搜索/过滤
     */
    @Test
    public void test08() {
        File dir = new
                File("F:\\课堂\\Java面向对象编程基础\\data");
        FilenameFilter filter = new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return name.endsWith(".html");
            }
        };
        File[] files = dir.listFiles(filter);
        System.out.println(Arrays.toString(files));
        FileFilter fileFilter = new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.isFile() &&
                        pathname.getName().endsWith(".html");
            }
        };
        files = dir.listFiles(fileFilter);
        System.out.println(Arrays.toString(files));
    }
}
